package com.example.loginpilot_01.service.user;

import com.example.loginpilot_01.entity.User;
import org.springframework.stereotype.Service;
import org.springframework.security.crypto.password.PasswordEncoder;



@Service
public class UserService {

    //封装它们
    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder; // 注入Spring Security的密码编码器

    // 构造方法注入（必须包含这两个依赖）
    public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }

    // 登录验证（使用加密校验）
    public boolean login(String username, String password) {
        // 从数据库查询用户名和密码匹配的用户
        User user = userRepository.findByUsername(username);
        if (user == null) {
            return false; // 用户名不存在
        }
        // 用编码器校验密码（明文 vs 密文）
        return passwordEncoder.matches(password, user.getPassword());
    }

    // 注册/新增用户（加密存储密码）
    public String register(User user, String confirmPassword) {
        // 后端二次校验（防止前端绕过校验）
        // 1. 校验必填字段
        if (user.getUsername() == null || user.getUsername().trim().isEmpty()) {
            return "用户名不能为空";
        }
        if (user.getPassword() == null || user.getPassword().trim().isEmpty()) {
            return "密码不能为空";
        }
        if (confirmPassword == null || confirmPassword.trim().isEmpty()) {
            return "确认密码不能为空";
        }

        // 2. 校验密码长度和一致性
        if (user.getPassword().length() < 6) {
            return "密码长度不能少于6位";
        }
        if (!user.getPassword().equals(confirmPassword)) {
            return "两次密码不一致";
        }

        // 3. 校验用户名是否已存在
        if (userRepository.existsByUsername(user.getUsername())) {
            return "用户名已被占用，请更换";
        }

        // 4. 校验电话/邮箱二选一
        if ((user.getPhone() == null || user.getPhone().trim().isEmpty()) &&
                (user.getEmail() == null || user.getEmail().trim().isEmpty())) {
            return "电话和邮箱至少填写一个";
        }

        // 5. 密码加密 + 分配默认角色
        user.setPassword(passwordEncoder.encode(user.getPassword())); // 加密密码
        user.setRole("ROLE_USER"); // 默认普通用户角色

        // 6. 保存用户到数据库
        userRepository.save(user);
        return null; // 返回null表示注册成功
    }

    // 按用户名查询用户（供登录使用）
    public User findByUsername(String username){
            return userRepository.findByUsername(username);
    }

}
